package com.wmx.mp.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import java.io.Serializable;
import java.util.Date;

/**
 * 用户实体
 * 1、mybatis-plus(其他框架也是一样)默认会以使用的实体类名(驼峰转下划线)作为数据库的表名，如果不符合规则，则需要使用注解进行转换。
 * 2、@TableName：表名注解，标识实体类对应的数据库表名，标记在实体类上。
 * * 如果实体类名与数据库表满足映射规则，比如驼峰转下划线，则注解可以省略。
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2023/3/4 8:51
 */
@TableName("bas_user")
public class BasUser implements Serializable {
    /**
     * 1、mybatis-plus 默认会以实体中名叫'id'的属性作为数据库表的主键映射，当命名不规范时，必须使用 @TableId 明确指定主键属性对应的数据库表主键名称。
     * 否则启动就会有日志警告：
     * Can not find table primary key in Class: "com.wmx.mp.pojo.BasUser".
     * Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method.
     * 2、@TableId 注解 value 属性：字段名称，实体属性名称与数据库表列名能对应上时，可以省略，否则需要明确指定为数据表的列名。
     * 3、@TableId 注解 type 属性：主键类型。不单独指定时，会使用全局配置 mybatis-plus.global-config.db-config.id-type
     * # AUTO：数据库ID自增，需要确保数据库设置了 ID自增 否则无效；
     * # NONE：该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
     * # INPUT: 用户输入ID，通过自己注册自动填充插件进行填充。
     * # ASSIGN_ID：当插入对象ID为空时，使用雪花算法自动填充分配ID(主键类型为number或string）
     * # ASSIGN_UUID：当插入对象ID为空时，使用UUID.replace("-","")自动填充分配ID(主键类型为string）
     */
    @TableId(value = "user_Id", type = IdType.ASSIGN_ID)
    private Long userId;

    /**
     * 1、@TableField：字段注解（非主键），可以省略。
     * * value：数据库字段名，默认为""，会自动映射；
     * * exist：是否为数据库表字段，默认为 true。配置为false时，操作数据库将不再带上这个字段，否则会因为字段不存在而sql错误。
     * * select：是否进行 select 查询，默认为 true；
     */
    @TableField(value = "user_name", exist = true, select = true)
    private String userName;
    private String email;
    private Date birthday;
    private Date createTime;
    /**
     * 自动排序，用法与SpringDtaJpa的OrderBy类似。
     * 在执行MybatisPlus的方法selectList(),Page()等非手写查询时自动带上.
     * asc：默认倒序，设置 true 顺序
     * sort：数字越小,order by 中越靠前
     * <pre>
     *    fill-字段自动填充策略：插入和更新时自动填充字段值，无需手动处理。
     *    同时提供 {@link MetaObjectHandler}-元对象字段填充控制器，实现公共字段自动写入。
     * </pre>
     */
    @OrderBy(asc = false, sort = 1)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    /**
     * 1、@TableLogic：表字段逻辑处理注解（逻辑删除），用于标记在逻辑删除的字段上。
     * 2、字段类型支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
     * 3、当省略时，默认使用全局配置：
     * * mybatis-plus.global-config.db-config.logic-delete-field
     * * mybatis-plus.global-config.db-config.logic-delete-value
     * * mybatis-plus.global-config.db-config.logic-not-delete-value
     */
    @TableLogic(value = "2", delval = "1")
    private Integer isDelete;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Integer getIsDelete() {
        return isDelete;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public void setIsDelete(Integer isDelete) {
        this.isDelete = isDelete;
    }

    @Override
    public String toString() {
        return "BasUser{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                ", isDelete=" + isDelete +
                '}';
    }
}